home *** CD-ROM | disk | FTP | other *** search
/ Belgian Amiga Club - ADF Collection / BS1 part 65.zip / BS1 part 65 / Delitracker v1.21.adf / Developer / Programmierung.dok < prev    next >
Text File  |  1992-05-17  |  18KB  |  537 lines

  1.  
  2.  
  3.                      Wie schreibt man externe Player?
  4.  
  5.                             © 1992 by Delirium
  6.                              Datum 15.05.1992
  7.  
  8.  
  9.  
  10.  
  11. Das externe Player Konzept
  12.  
  13. DeliTracker unterstützt sog. externe Player, das sind Player die in einem 
  14. speziellen Format vorliegen und von DeliTracker nachgeladen werden können. 
  15. Ist ein solcher Player geladen worden erkennt und spielt DeliTracker die 
  16. Module, die von diesem Player unterstützt werden. Derzeit kann DeliTracker
  17. maximal 64 externe Player nachladen. Dies sollte jedoch erst mal für eine
  18. Weile reichen.
  19.  
  20. Beim Start von DeliTracker werden alle Player die sich im Verzeichnis
  21. 'DeliPlayers' (b.z.w im Configfile gespeicherten Playerpfad) befinden 
  22. geladen. Zusätzlich haben Sie jederzeit die Möglichkeit einen weiteren
  23. b.z.w. neueren Player nachzuladen. Diese Player verleihen DeliTracker
  24. seine ungeahnte Flexibilität.
  25.  
  26. Externe Player sind Executables, d.h. sie werden reloziert. Am Anfang
  27. besitzen sie die charakteristische Playerstruktur. Sie wird mit dem Macro
  28. aus dem Includefile 'misc/deliplayer.i' erzeugt.
  29.  
  30. Es ist relativ einfache eine Replayroutine an DeliTracker anzupassen.
  31. Das 'einzige' was Sie tun müssen ist ein wenig Interfacecode zu schreiben.
  32. Dies ist aber halb so wild, denn DeliTracker stellt ihnen viele hilfreiche
  33. Routinen zur Verfügung.
  34.  
  35.  
  36. 1. Grundvoraussetzungen
  37.  
  38. Um ein neues Soundsystem anzupassen, benötigen Sie zum einen den Sourcecode
  39. oder ein linkbares Objektfile der Replayroutine, zum anderen mindestens ca.
  40. 5 Module zum testen der Funktionstüchtigkeit des Players.
  41.  
  42.  
  43. 2. Schematischer Aufbau eines externen Players
  44.  
  45. {
  46.     Playerheader
  47.  
  48.     TagArray
  49.  
  50.     Interfacecode
  51.  
  52.     Replaycode+Daten
  53. }
  54.  
  55.  
  56. 3. Funktionen, die der externe Player zur Verfügung stellt
  57.  
  58. Das PLAYERHEADER Macro generiert den Header, der das File als externen Player
  59. identifiziert. Dieses Macro muß angegeben werden und ganz am Anfang des Players
  60. stehen. Als einziger Parameter ist ein Pointer auf ein Tag Array einzutragen,
  61. in dem alle Funktionen stehen, die der Player DeliTracker zur Verfügung stellt.
  62. Bei allen Funktionsaufrufen außer der Interruptroutine (DTP_Interrupt) enthält a5
  63. die Base. Globale Variablen können dadurch adressiert werden. (Siehe auch
  64. 'misc/deliplayer.i'). Da DeliTracker vor Aufruf einer Playerroutine (außer bei
  65. DTP_Interrupt) alle Register sichert, dürfen diese verändert werden.
  66.  
  67.  
  68. PLAYERHEADER <tagarray>
  69.  
  70.     tagarray    Pointer auf ein Tag Array, das mit TAG_DONE
  71.             abgeschlossen sein muß. Tags, bei denen ti_Data NULL
  72.             ist, werden ignoriert.
  73.             Außerdem können folgende SystemTags verwendet werden:
  74.               TAG_DONE
  75.               TAG_IGNORE
  76.               TAG_MORE
  77.               TAG_SKIP
  78.  
  79.  
  80. Derzeit existieren folgende Tags:
  81.  
  82. DTP_CustomPlayer    dieser Tag deklariert einen Player als Customplayer
  83.             ti_Data darf nicht NULL sein !
  84.  
  85. DTP_RequestDTVersion    damit kann man sicherstellen, daß mindestens eine bestimmte
  86.             Version von DeliTracker vorhanden ist. Dieser Tag muß
  87.             angegeben werden, wenn bei den DeliTrackerGlobals neue
  88.             Funktionspointer hinzugekommen sind und diese vom Player
  89.             benutzt werden. ti_Data ist dabei die Playerrevision.
  90.  
  91. DTP_RequestV37        wenn dieser Tag vorhanden ist, wird der Player nur noch
  92.             von der Kick 2.0 Version von DeliTracker geladen.
  93.             (d.h. dtg_GadToolsBase ist gültig)
  94.  
  95. DTP_PlayerVersion    Tag, der die Revisionsnummer des Players enthält.
  96.             Bei zwei Playern mit dem gleichen Playernamen wird
  97.             derjenige mit der größeren Revisionsnummer geladen.
  98.  
  99. DTP_PlayerName        ti_Data enthält den Pointer auf den Namen des Players.
  100.             Dieser String kann zwar beliebig lang sein aber zur Zeit
  101.             werden nur die ersten 24 Zeichen angezeigt.
  102.             Dieser Tag muß existieren !
  103.  
  104. DTP_Creator        Pointer auf den Namen des Autors. Dieser wird im Setup-
  105.             fenster im Playerinfofeld angezeigt. Dieser String kann
  106.             $A als Zeilenumbruch enthalten.
  107.  
  108. DTP_Check1        Pointer auf eine Modulerkennungsroutine, die die aufgerufen
  109.             wird, wenn 1024 Bytes des Moduls geladen sind. Wird das
  110.             Modul erkannt, liefert sie d0=0, ansonsten d0<>0. 
  111.  
  112. DTP_Check2        Pointer auf eine Modulerkennungsroutine, die die aufgerufen
  113.             wird, wenn das komplette Modul geladen und evtl. entpackt
  114.             ist. Wird das Modul erkannt, liefert sie d0=0, ansonsten
  115.             d0<>0.
  116.  
  117. DTP_ExtLoad        Pointer auf eine optionale Laderoutine für Module. Ist
  118.             kein Fehler aufgetreten, wird d0=0 zurückgegeben, sonst
  119.             d0<>0. Hinweis: Achten Sie darauf, daß im Fehlerfall alle
  120.             allocierten Ressourcen (Memory, Locks, ...) wieder frei-
  121.             gegeben werden, da dann keine weiteren Playerfunktionen
  122.             mehr angesprungen werden.
  123.  
  124. DTP_Interrupt        Pointer auf eine Interruptroutine, die mittels eines
  125.             Timerinterrupts standardmäßig alle 1/50 sec aufgerufen
  126.             wird. Dies ist die Standardmethode, um mit der richtigen
  127.             Abspielgeschwindigkeit auf im PAL/NTSC/Productivity
  128.             Videomodus zu spielen. Wenn keine DTP_faster/DTP_slower
  129.             Tags angegeben sind, übernimmt DeliTracker dies durch
  130.             Verändern der Interruptfrequenz. Dieser Tag kann auch
  131.             nicht existieren, dann müssen aber DTP_StartInt/DTP_StopInt
  132.             vorhanden sein !
  133.  
  134. DTP_Stop        Pointer auf eine optionale Stoproutine. Wenn dieser Tag
  135.             nicht vorhanden ist, verfährt DeliTracker folgendermaßen:
  136.                 Interrupt stoppen (DTP_StopInt)
  137.                 Sound Cleanup (DTP_EndSnd)
  138.                 Song initialisieren (DTP_InitSnd)
  139.             Ansonsten hat diese Routine die Aufgabe, einen evtl.
  140.             spielenden Song anzuhalten und so zu initialisieren, daß
  141.             dieser beim nächsten Starten des Interrupts von    Anfang an
  142.             zu spielen beginnt.
  143.  
  144. DTP_Config        Pointer auf eine optionale Initialisierungsroutine. Diese
  145.             wird nur einmal unmittelbar nach dem Laden des Players
  146.             aufgerufen. Mögliche Anwendungen: Laden einer player-
  147.             spezifischen Konfigurationsdatei. 
  148.  
  149. DTP_UserConfig        Pointer auf eine optionale Initialsierungsroutine. Diese
  150.             wird nur dann aufgerufen, wenn der User den Player im
  151.             Setupfenster anwählt und das 'Config' Gadget drückt.
  152.             Mögliche Anwendungen: Öffnen eines Fensters zum Setzen
  153.             weiterer Optionen (Instrumentenpfad, ...) und abspeichern
  154.             einer playerspezifischen Konfigurationsdatei.
  155.  
  156. DTP_SubSongRange    Dieser Tag sollte angegeben werden, wenn der Player Multi-
  157.             Module unterstützt. ti_Data zeigt dabei auf eine Routine,
  158.             die als Returnwert in d0 die minimale und in d1 die maximale
  159.             Subsongnummer zurückgeben muß.
  160.  
  161. DTP_InitPlayer        Pointer auf eine optionale Initialsierungsroutine, die
  162.             aufgerufen wird, wenn ein Modul erfolgreich geladen wurde.
  163.             Tritt kein Fehler auf, liefert sie d0=0, ansonsten d0<>0.
  164.             Hier muß die Allocation der Audiokanäle stattfinden !
  165.             (DeliTracker stellt dafür eine eigene Routine zur Verfügung)
  166.             Falls der Player Multi-Module unterstützt, muß hier
  167.             dtg_SndNum(a5) auf die erste Subsongnummer gesetzt werden.
  168.  
  169. DTP_EndPlayer        Pointer auf eine optionale Cleanuproutine, die aufgerufen
  170.             wird, wenn das Modul aus dem Speicher entfernt wird. Hier
  171.             muß die Freigabe der Audiokanäle stattfinden ! (DeliTracker
  172.             stellt dafür eine eigene Routine zur Verfügung)
  173.  
  174. DTP_InitSound        Pointer auf eine optionale Initialsierungsroutine.
  175.             Diese muß das Modul initialisieren, so daß beim Starten
  176.             des Interrupts der Song von Anfang an zu spielen beginnt.
  177.  
  178. DTP_EndSound        Pointer auf eine optionale Cleanuproutine.
  179.             Diese kann z.B. die Lautstärkeregister und die Audio-DMA
  180.             rücksetzen.
  181.  
  182. DTP_StartInt        Pointer auf eine Initialsierungsroutine, die existieren
  183.             muß, wenn DTP_Interrupt nicht vorhanden ist. In diesem
  184.             Fall muß hier der Sound gestartet werden.
  185.  
  186. DTP_StopInt        Pointer auf eine Cleanuproutine, die existieren muß,
  187.             wenn DTP_Interrupt nicht vorhanden ist. In diesem Fall
  188.             muß hier der Sound gestoppt werden.
  189.  
  190. DTP_Volume        Pointer auf eine Funktion, die die Lautstärke neu setzt.
  191.             Die Funktion wird aufgerufen, wenn die Volume neu gesetzt
  192.             wird (Slider, ARexx-Kommando) und beim Initialisieren des
  193.             Moduls vor DTP_InitSnd. Die Mastervolume steht in
  194.             dtg_SndVol(a5). Die Mastervolume ist dabei der maximale 
  195.             Volumewert. Die effektive Volume errechnet sich also
  196.             durch: VOL_eff = ( (MASTERVOLUME*modulevolume) >> 6 ).
  197.             Näheres siehe Beispielsourcen.
  198.  
  199. DTP_Balance        Pointer auf eine Funktion, die die Balance neu setzt.
  200.             Die Funktion wird aufgerufen, wenn die Balance neu gesetzt
  201.             wird (Slider, ARexx-Kommando) und beim Initialisieren des
  202.             Moduls vor DTP_InitSnd. Die Balance für die linken Kanäle
  203.             steht in dtg_SndLBal(a5), für die rechten Kanäle in
  204.             dtg_SndRBal(a5). Hinweis: Alle Player die Balance unterstützen
  205.             können auch Volume ! Man verwendet dann die gleiche Routine 
  206.             zum setzen der Volume&Balance. Die linke Volume errechnet
  207.             sich wie folgt: ( ( dtg_Volume(a5) * dtg_SndLBal(a5) ) >> 6 )
  208.             Entsprechendes gilt für rechts.
  209.  
  210. DTP_Faster        Pointer auf eine Funktion, die den Abspielvorgang
  211.             beschleunigt.
  212.  
  213. DTP_Slower        Pointer auf eine Funktion, die den Abspielvorgang
  214.             verlangsamt.
  215.  
  216. DTP_NextPatt        Pointer auf eine Funktion, die den den Patternzeiger um
  217.             eins erhöht.
  218.  
  219. DTP_PrevPatt        Pointer auf eine Funktion, die den den Patternzeiger um
  220.             eins erniedrigt.
  221.  
  222. DTP_NextSong        Pointer auf eine Funktion, die Subsongnummer auf den den
  223.             nächsten Subsong setzt und diesen spielt.
  224.             (Falls vorhanden)
  225.  
  226. DTP_PrevSong        Pointer auf eine Funktion, die Subsongnummer auf den den
  227.             vorhergehenden Subsong setzt und diesen spielt.
  228.             (Falls vorhanden)
  229.  
  230.  
  231.  
  232. 4. Funktionen, die DeliTracker dem externen Player zur Verfügung stellt
  233.  
  234. Eine Funktion wird wie folgt aufgerufen:
  235.  
  236.     move.l    dtg_XXX(a5),a0
  237.     jsr    (a0)
  238.  
  239. Alle folgenden Funktionen außer dtg_SongEnd verwenden d0/d1/a0/a1 als
  240. Scratchregister. In a5 muß bei allen Aufrufen die Base stehen.
  241.  
  242. Derzeit existieren folgende Funktionen:
  243.  
  244. dtg_GetListData
  245.  
  246.     SYNOPSIS
  247.         memory size = dtg_GetListData(number)
  248.             a0     d0                     d0.l
  249.  
  250.     FUNCTION
  251.         Liefert Adresse und Länge eines mit LoadFile() geladenen Files.
  252.  
  253.     INPUTS
  254.         number - Nummer eines Files beginnend mit 0 für das vom User
  255.         selektierte File.
  256.  
  257.     RESULT
  258.         memory - ein Pointer auf die Startadresse des Files im Speicher
  259.              oder NULL im Fehlerfall.
  260.         size - Länge des Files in Bytes bzw. 0 im Fehlerfall.
  261.  
  262.  
  263. dtg_LoadFile
  264.  
  265.     SYNOPSIS
  266.         success = dtg_LoadFile(name)
  267.  
  268.     FUNCTION
  269.         Lädt und entpackt ggf. das angegebene File ins Chip-Memory.
  270.         (Hinweis: diese Funktion ergänzt automatisch, falls das File
  271.          mit dem angegebenen Namen nicht geöffnet werden konnte '.pp')
  272.  
  273.     INPUTS
  274.         name - der Filename steht in einem internen Buffer (seine
  275.                Adresse steht in dtg_PathArray)
  276.  
  277.     RESULT
  278.         success - alles ok d0.l=0, sonst d0.l<>0.
  279.  
  280.  
  281. dtg_CopyDir
  282.  
  283.     SYNOPSIS
  284.         dtg_CopyDir()
  285.  
  286.     FUNCTION
  287.         Kopiert das Directory des von User angewählten Files an das
  288.         Ende des Strings, auf den dtg_PathArray(a5) zeigt.
  289.  
  290.  
  291. dtg_CopyFile
  292.  
  293.     SYNOPSIS
  294.         dtg_CopyFile()
  295.  
  296.     FUNCTION
  297.         Kopiert den Filenamen des von User angewählten Files an das
  298.         Ende des Strings, auf den dtg_PathArray(a5) zeigt.
  299.  
  300.  
  301. dtg_CopyString
  302.  
  303.     SYNOPSIS
  304.         dtg_CopyString(string)
  305.                            a0
  306.  
  307.     FUNCTION
  308.         Kopiert den String, auf den das Register a0 zeigt, an das
  309.         Ende des Strings, auf den dtg_PathArray(a5) zeigt.
  310.  
  311.     INPUTS
  312.         string - der Pointer auf den anzuhängenden String steht in a0
  313.  
  314.  
  315. dtg_AudioAlloc
  316.  
  317.     SYNOPSIS
  318.         success = dtg_AudioAlloc()
  319.  
  320.     FUNCTION
  321.         Belegt alle Audiokanäle.
  322.  
  323.     RESULT
  324.         success - alles ok d0.l=0, sonst d0.l<>0.
  325.  
  326.  
  327. dtg_AudioFree
  328.  
  329.     SYNOPSIS
  330.         dtg_AudioFree()
  331.  
  332.     FUNCTION
  333.         Gibt die mit dtg_AudioAlloc belegten Audiokanäle wieder frei.
  334.  
  335.  
  336. dtg_StartInt
  337.  
  338.     SYNOPSIS
  339.         dtg_StartInt()
  340.  
  341.     FUNCTION
  342.         Startet den Soundinterrupt. (Falls er nicht schon läuft.)
  343.         Falls DTP_Interrupt existiert, startet DeliTracker einen
  344.         Timerinterrupt, ansonsten wird DTP_StartInt aufgerufen.
  345.  
  346.  
  347. dtg_StopInt
  348.  
  349.     SYNOPSIS
  350.         dtg_StopInt()
  351.  
  352.     FUNCTION
  353.         Stoppt den Soundinterrupt. (Falls er nicht schon angehalten
  354.         ist.) Falls DTP_Interrupt existiert, stoppt DeliTracker seinen
  355.         Timerinterrupt, ansonsten wird DTP_StopInt aufgerufen.
  356.  
  357.  
  358. dtg_SongEnd
  359.  
  360.     SYNOPSIS
  361.         dtg_SongEnd()
  362.  
  363.     FUNCTION
  364.         Signalisiert DeliTracker, daß das Modul einmal komplett
  365.         gespielt wurde. Diese Funktion verändert keine Register
  366.         und darf auch von Interrupts aufgerufen werden.
  367.  
  368.  
  369. dtg_CutSuffix
  370.  
  371.     SYNOPSIS
  372.         dtg_CutSuffix()
  373.  
  374.     FUNCTION
  375.         Entfernt am Ende des Strings, auf den dtg_PathArray(a5) zeigt
  376.         ggf. die Endung '.pp'
  377.  
  378.  
  379.  
  380. 5. Die Modul-Erkennung
  381.  
  382. Damit DeliTracker die einzelnen Module unterscheiden kann, befindet sich in
  383. jedem Player eine Erkennungsroutine, die auf ein zugehöriges Modul testet.
  384. Diese Routine prüft auf Stellen im Modul, die bei allen Modulen eines Players
  385. gleich sind. So z.B. auf 'M.K.' bei Offset $438 im NoiseTracker-Player.
  386. Bei Sound- und NoiseTracker ist nur das Modul abgespeichert, z.B. bei MarkII
  387. hängt vor jedem Modul noch die Replayroutine. Bei so einem Modul müssen Sie
  388. auf signifikante Assemblerbefehle testen. Ein Vergleich auf ein oder zwei
  389. Sprungbefehle, egal ob bra oder jmp, ist hier nicht ausreichend, da bei
  390. vielen Modulen dieses Typs Sprungtabellen am Anfang stehen und der Player
  391. möglicherweise das falsche Modul erkennen könnte, was in den meisten Fällen
  392. zum Absturz führt.
  393. Der Player MUß GENAU EINE Checkroutine verwenden. Daraus ergeben sich zwei
  394. Grundtypen von Playern.
  395.  
  396.  
  397.   1. Typ eins Player - in der Regel etwas komplexer
  398.     Bei ihnen ist die Check1 Funktion implementiert.
  399.   
  400.     Vorteil: Es lassen sich auch Player realisieren, die das Modul selbst nachladen.
  401.     Nachteil: Gepackte Files werden nicht unterstützt.
  402.   
  403.     Dieser Player sollte nur für Härtefälle verwendet werden.
  404.     (z.B: FTM, IFF-8SVX Player, der das Sample während dem Spielen nachlädt, ...)
  405.   
  406.  
  407.   2. Typ zwei Player - die einfachere Variante
  408.     Bei ihnen ist die Check2 Funktion implementiert
  409.  
  410.     Vorteil: Das Modul kann gepackt sein, der Player bemerkt davon nichts.
  411.     Nachteil: Das Modul ist in jedem Fall im Chip-Memory.
  412.  
  413.     Es sollte im Normalfall dieser Playertyp verwendet werden.
  414.  
  415.  
  416. Egal ob Typ eins oder zwei, wenn der Player das Modul erkannt hat, muß er
  417. in d0.l=0 zurückliefern, wenn nicht d0.l<>0.
  418.  
  419.  
  420. 6. Player-Interrupt
  421.   Hier gibt es auch grob eine Einteilung in zwei verschiedene Typen.
  422.  
  423.   1. Player die den DeliTracker Interrupt verwenden
  424.     Vorteil: Der Player ist vom Videomodus unabhängig.
  425.              Besitzt automatisch die faster/slower Funktion.
  426.          Kein Aufwand für den Interrupt (Code + Interruptstruktur).
  427.          Ist kompatibel zum serial.device
  428.     Nachteil: Der Interrupt kommt nicht synchron zum VBlank. (Dies führt
  429.           nur in den seltensten Fällen zu Problemen.)
  430.  
  431.   2. Player die ihren eigenen Interrupt erzeugen.
  432.     Vorteil: Es können andere Interruptquellen benutzt werden
  433.          (z.B. AudioIRQ).
  434.     Nachteil: Erhöhter Aufwand, bei VBlank nicht mehr unabhängig vom
  435.           Videomodus.
  436.  
  437.     Wenn ein eigener Timerinterrupt verwendet wird, sollte die CIAB 
  438.     (wg. OS2.0) und die entsprechenden Resourcefunktionen verwendet werden.
  439.     Außerdem ist es sehr sinnvoll die Replayroutine nicht direkt im CIA-B Timer-
  440.     Interrupt abspielen zu lassen, sondern im Timerinterrupt einen Soft Interrupt 
  441.     mittels Cause() zu generieren. In diesem SoftInt kann man dann die eigentliche 
  442.     Replayroutine ablaufen lassen. So hat man den Vorteil, daß man wesentlich 
  443.     kompatibler zum serial.device ist. Dies liegt daran, daß SoftInt eine 
  444.     niedrigere Priorität als der der RBF (Read Buffer Full) Interrupt hat d.h. 
  445.     erst wird der serielle Port bedient, dann erst die Replayroutine.
  446.     Es wird davor gewarnt, direkt in die Interruptvektoren zu schreiben!
  447.     Zur Erinnerung: vom Betriebssystem werden die Funktionen AddIntServer()
  448.                 und SetIntVector() zur Verfügung gestellt ! 
  449.  
  450.  
  451.  
  452. 7. Custom Module
  453.   Dies sind keine Module im herkömmlichen Sinn, sondern im wesentlichen
  454.   Player, die ein Spezialmodul beinhalten. Mit diesem Format können Sie
  455.   auch die ausgefallensten Module mit DeliTracker abspielen. Sollten für
  456.   den Player jedoch mehrere Module existieren, ist es in dem Fall ratsam,
  457.   einen richtigen Player zu schreiben.
  458.  
  459. Schematischer Aufbau eines Custom Moduls
  460.  
  461. {
  462.     Playerheader
  463.  
  464.     TagArray
  465.  
  466.     Interfacecode
  467.  
  468.     Replaycode+Daten
  469.  
  470.     MODUL
  471. }
  472.  
  473. Mit dem Tag DTP_CustomPlayer wird ein Player als Customplayer deklariert
  474. und folgende Tags sind dann bedeutungslos:
  475.  
  476.     - DTP_PlayerVersion
  477.     - DTP_PlayerName
  478.     - DTP_Creator
  479.     - DTP_Check1
  480.     - DTP_Check2
  481.     - DTP_ExtLoad
  482.     - DTP_Config
  483.     - DTP_UserConfig
  484.  
  485.  
  486.  
  487. 8. Checkliste
  488. Dies ist eine kleine Checkliste für Player/Custommodul Anpassung, die erfüllt
  489. werden muß, damit der Player systemkonform ist und einwandfrei funktioniert.
  490.  
  491.     [ ] ist die Checkroutine präzise genug ?
  492.     [ ] werden die Audiokanäle richtig belegt und freigegeben ?
  493.     [ ] wird aller allocierter Speicher freigegeben ?
  494.     [ ] werden alle Locks wieder freigegeben ?
  495.     [ ] enforcer und mungwall - Test bestanden ?
  496.     [ ] werden alle möglichen Fehler korrekt abgefangen ?
  497.     [ ] wurde der Player mit 1.2, 1.3 und 2.0 getestet ?
  498.     [ ] spielt der Player in allen Videomodi korrekt ?
  499.  
  500.  
  501. 9. Diverses 
  502. Der Player sollte den Zustand der LED unbeeinflußt lassen, da im Setupwindow
  503. ein entsprechende Funktion existiert.
  504.  
  505.  
  506. Problemecke
  507.  
  508. Symptom        mögliche Ursache            Beseitigung
  509.  
  510. Absturz        a5 überschrieben
  511.         Register nicht gesichert
  512.         falsche oder zu späte Initialisierung    
  513.         Modul zu neu für den Player        präziserer Check
  514.  
  515. klingt schräg    Audiodaten nicht im Chipmem        Player ins Chipmem
  516.         falsche Initialisierung
  517.         Modul zu neu für den Player        präziserer Check
  518.         Player benötigt bestimmte Werte in    zusätzliche Initialisierung
  519.         einigen Registern
  520.         unverträglicher Videomodus
  521.  
  522. kein Ton    Audio-DMA abgeschaltet
  523.  bei >68000    Player schreibt direkt auf        Betriebssystemfuntionen
  524.         Interruptvektoren            benutzen
  525.  
  526. fast keine    fehlerhaftes Interrupt-Handling        bei VBlank-IRQ:
  527. freie CPU-Zeit                        Z-Flag muß am Ende gesetzt sein!
  528.  
  529. lahmes System    68000/020/030 zu langsam        60040 kaufen ;-)
  530.  
  531.  
  532.  
  533.  
  534.  
  535.  
  536.  
  537.